package com.xixi.core.rpc.server.tcp;

import com.xixi.core.rpc.protocol.ProtocolConstant;
import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.parsetools.RecordParser;

/**
 * @author: zxh
 * @date: 2024/8/27 11:00
 * @description: 装饰者模式（使用recordParser对原有的buffer处理能力进行增强）
 */
public class TcpBufferHandlerWrapper implements Handler<Buffer> {

	private final RecordParser recordParser;

	public TcpBufferHandlerWrapper(Handler<Buffer> bufferHandler) {
		recordParser = initRecordParser(bufferHandler);
	}

	@Override
	public void handle(Buffer event) {
		recordParser.handle(event);
	}

	private RecordParser initRecordParser(Handler<Buffer> bufferHandler) {
		// 构造 parser
		RecordParser parser = RecordParser.newFixed(ProtocolConstant.MESSAGE_HEADER_LENGTH);

		parser.setOutput(new Handler<Buffer>() {
			// 初始化
			int size = -1;
			// 一次完整的读取（头 + 体）
			Buffer resultBuffer = Buffer.buffer();

			@Override
			public void handle(Buffer event) {
				if (-1 == size) {
					// 读取消息体长度
					size = event.getInt(13);
					parser.fixedSizeMode(size);
					// 写入头信息到结果
					resultBuffer.appendBuffer(event);
				} else {
					// 写入体信息到结果
					resultBuffer.appendBuffer(event);
					// 以拼接为完整buffer，执行处理
					bufferHandler.handle(resultBuffer);
					// 重置
					parser.fixedSizeMode(ProtocolConstant.MESSAGE_HEADER_LENGTH);
					size = -1;
					resultBuffer = Buffer.buffer();
				}
			}
		});
		return parser;
	}
}
